package main

import (
	"fmt"
)

// RequestInt
// @Description: 接口
type RequestInt interface {
	Handler(url string) string
}

type Request struct {
}

func (r Request) Handler(url string) string {
	return "http://" + url
}

type ReqDecorator1 struct {
	req RequestInt
}

func (r ReqDecorator1) Handler(url string) string {
	handler := r.req.Handler(url)
	return handler + "?req=1"
}

type ReqDecorator2 struct {
	req RequestInt
}

func (r ReqDecorator2) Handler(url string) string {
	handler := r.req.Handler(url)
	return handler + "?req=2"
}

// 它允许你动态地为对象添加行为或职责，而不需要修改对象的原始类。通过引入装饰者类，可以在运行时灵活地组合不同的功能，而不需要创建大量的子类。装饰者模式的核心思想是将对象包装在一个或多个装饰者中，每个装饰者都可以在调用被装饰对象的方法之前或之后添加额外的行为。
//
// 假设你正在开发一个 Web 服务，其中有一个核心功能是处理用户请求。现在，你需要在不修改核心功能代码的情况下，为请求处理添加以下功能：
//
// 日志记录：记录每个请求的详细信息。
// 性能监控：记录每个请求的处理时间。
// 使用装饰器模式，你可以轻松地实现这些功能，而无需修改原始请求处理逻辑。
func main() {
	request := Request{}
	reqDecorator1 := ReqDecorator1{req: request}
	reqDecorator2 := ReqDecorator2{req: reqDecorator1}
	fmt.Println(reqDecorator2.Handler("www.baidu.com"))
}
